/*! \file XmlLogger.hpp
    \brief Une classe qui transforme le format binaire simple en format XML.
*/

#ifndef __XML_LOGGER_HPP__
#define __XML_LOGGER_HPP__

#include "ILogger.hpp"
#include <unistd.h>
#include <cassert>
#include "alloc_stats.h"

#define ROOT "memoryTrace"
#define PID  "pid"
#define PPID "ppid"
#define EXE  "exe"

/**
 *\class XmlLogger
 *\brief Ecrit un rapport des allocation sur le tas au format XML dans 
 *le de fichier de sortie.
 */

class XmlLogger :virtual public ILogger
{
  
private:
 /**
  * \brief
  */
  FILE * out;
  
  /**
   * \brief
   */
  char path[50];
 
  /**
   * \brief
   */
  void openFile();
  
  /**
   * \brief
   */
  string bin;
  
public:
  /**
   *\brief ouvre l'element malloc
   */
  void startMalloc(void* addr,size_t size,unsigned int index,int tmm);
  
  /**
   *\brief ouvre l'element calloc
   */
  void startCalloc(void* addr,size_t nmemb,size_t size,int compteur_calloc,unsigned int memory_allocation);
  
  /**
   *\brief ouvre l'element realloc
   */
  void startRealloc(void*  v,void*  ret,size_t n,int id,size_t tm);
  
  /**
   *\brief ouvre l'element free
   *@see readAndDump()
   */
  void startFree(void* addr,unsigned nbfree);
  
  /**
   *\brief termine et ferme le document
   */
  void finalizeLog(alloc_stats &st);
  
  /**
   *\brief ferme un element type
   */
  void endElement(const char *type);
  
  /**
   *\brief instancie un transformeur XML
   */
  XmlLogger(string& bin)
  {
    this->bin=bin;
    openFile();
  }
  
  
  /**
   *\brief ferme le fichier xml de la trace des allocations	
   */
  ~XmlLogger(){
    if(out !=NULL)
    fclose(out);
  };
};

#endif
